package com.tedu.API.thread;

import org.junit.Test;

import javax.imageio.stream.ImageInputStream;
import java.io.File;
import java.io.FileFilter;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * Lambda表达式--->()->{} 【接口/抽象--匿名内部类】
 *                        【集合--匿名内部类】
 * Collection--->List：存重复元素并且有序【保存数据结构一致】
 *               Set：存无序并且不重复【保存数据结构一致】
 *               Queue：队列结合业务
 * Map---------->HashMap：键值对存储
 */
public class LambdaDemo {
    @Test
    public void testList(){
        //List集合：保存元素
        List<String> list=new ArrayList<>();
        list.add("白洋淀");
        list.add("正定古城");
        list.add("河头老街");
        list.add("白石山");
        //集合3种遍历方式：普通for、增强for、支持forEach方法
        for(String str: list){
            System.out.println("增强for："+str);
        }
        //支持forEach方法：遍历集合元素
        //Consumer接口针对List、set、Queue集合提供接口：功能获取list集合元素
        //accept()  获取list集合的所有元素
        list.forEach(new Consumer<String>(){
            public void accept(String s) {
                System.out.println("consumer接口遍历方案："+s);
            }
        });
        //支持forEach方法：遍历集合元素【Consumer 匿名内部类】
        //编写Lambda表达式写法
        list.forEach(s->System.out.println("Lambda遍历方案："+s));
    }

    @Test
    public void testMap(){
        //创建Map集合：键值对
        Map<Integer,String> map=new HashMap<>();
        map.put(1,"唐山");
        map.put(2,"石家庄");
        map.put(3,"秦皇岛");
        map.put(4,"邯郸");
        //遍历集合：普通for、增强for、forEach(BiConSummer接口---匿名内部类)
        //键值对-->一组Entry对象
        //BiConSummer接口---获取每组Entry对象---accept()获取Entry对象
        map.forEach(new BiConsumer<Integer, String>() {
            public void accept(Integer integer, String s) {
                System.out.println("键"+integer+"值："+s);
            }
        });

        //使用Lambda表达式
        map.forEach((i,s)-> System.out.println("lambda值："+s));
    }
    /**
     * 作业：  1.使用Lambda表达式完成 Thread线程创建
     *        2.使用Lambda表达式完成 Runnable线程创建
     *        3.IO流---File类：listFile(FileFilter接口)【5行代码】
     *         目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     *        4.IO流---File类：listFile(FileFilter接口)【2行代码】
     *         目标：【io包下FilterAPI类】实现使用Lambda表达式完成
     *        5.集合：改写lambda写法
     *          目标：【list包下ListAPI类下单元测试：testComparator()】
     *          LambdaDome类下---完成作业
     * @LambdaHomeWork1
     * @LambdaHomeWork2
     *       ...
     * 提交  11/8  中午12前
     */

    @Test
    public void LambdaHomeWork1(){
        //使用Lambda表达式完成Thread线程创建
        //Thread类Java定义线程类---具备启动start---
        //Thread类内嵌Runnable类---线程run运行
        Thread thread = new Thread(new Runnable() {
            public void run() {for(int i=0;i<1000;i++) {
                System.out.println("1");
            }}
        });
        thread.start();
    }
    @Test
    public void LambdaHomeWork2(){
        //1.创建Runnable接口---run()
        Runnable runnable = () -> {
            for(int i=0;i<1000;i++){
            System.out.println("1");
        }};
        //2.创建Thread线程类---start()
        Thread thread = new Thread(runnable);
        //3.启动线程
        thread.start();
    }
    @Test
    public void LambdaHomeWork3(){
        File file=new File(".");
        FileFilter my=(pathname)->{return pathname.getName().startsWith("s");};
        File[] subs=file.listFiles(my);
        for(int i=0;i< subs.length;i++){
            System.out.println("所有的文件和文件夹的名："+subs[i].getName());
        }
    }
    @Test
    public void LambdaHomeWork4(){
        for(File f:new File(".").listFiles((pathname)->{return pathname.getName().startsWith("s");})){
            System.out.println("遍历后过滤完成："+f);
        }
    }
    @Test
    public void LambdaHomeWork5(){
        List<String> textList = new ArrayList<>();
        textList.add("1");
        textList.add("2");
        textList.add("3");
        textList.sort(Comparator.comparingInt(String::length));
        textList.forEach(System.out::println);
    }
}














































